#!/bin/bash

# --- 检查异常acs_server ---
ACS_CHECK_PROCESS_NAME="acs_server.jar"

echo "=== 开始检查所有 '$ACS_CHECK_PROCESS_NAME' 进程的端口状态 ==="

# 1. 获取所有相关进程的PID列表
ACS_CHECK_PIDS=$(ps -ef | grep "$ACS_CHECK_PROCESS_NAME" | grep -v 'grep' | awk '{print $2}')

# 2. 检查是否找到了任何进程
if [ -z "$ACS_CHECK_PIDS" ]; then
    echo "未找到任何正在运行的 '$ACS_CHECK_PROCESS_NAME' 进程。"
    echo "==================== 检查完成 ===================="
    exit 0
fi

echo "发现以下 '$ACS_CHECK_PROCESS_NAME' 进程: $ACS_CHECK_PIDS"

# 3. 初始化一个用于存储“问题进程”PID的列表
ACS_CHECK_PIDS_TO_KILL=""

# 4. 循环遍历所有找到的PID，进行检查
for ACS_CHECK_PID in $ACS_CHECK_PIDS; do
    # 使用 ss 精确检查该PID是否在监听端口
    if ss -plnt | grep -q "pid=$ACS_CHECK_PID\b"; then
        echo "  [PID: $ACS_CHECK_PID] ... ✅ 状态正常，端口在监听中。"
    else
        echo "  [PID: $ACS_CHECK_PID] ... ❌ 状态异常，未监听端口！已加入待处理列表。"
        # 将有问题的PID追加到待处理列表
        ACS_CHECK_PIDS_TO_KILL="$ACS_CHECK_PIDS_TO_KILL $ACS_CHECK_PID"
    fi
done

echo "====================================================="

# 5. 检查待处理列表，如果非空，则执行批量结束操作
if [ -z "$ACS_CHECK_PIDS_TO_KILL" ]; then
    echo "所有 '$ACS_CHECK_PROCESS_NAME' 进程均在正常监听端口，无需任何操作。"
else
    # 使用 xargs 去除前后的空格，让输出更美观
    ACS_CHECK_CLEANED_PIDS=$(echo "$ACS_CHECK_PIDS_TO_KILL" | xargs)
    
    echo "发现以下进程没有正常监听端口，准备批量结束:"
    echo "  -> $ACS_CHECK_CLEANED_PIDS"
    
    # 执行批量 kill 命令
    kill -9 $ACS_CHECK_CLEANED_PIDS
    
    echo "批量结束命令已发送。"
    
    # 可以选择增加一个等待和确认的步骤
    sleep 2
    echo "正在确认状态..."
    for ACS_CHECK_PID in $ACS_CHECK_CLEANED_PIDS; do
        if ! ps -p "$ACS_CHECK_PID" > /dev/null; then
            echo "  [PID: $ACS_CHECK_PID] ... ✅ 已成功结束。"
        else
            echo "  [PID: $ACS_CHECK_PID] ... ⚠️ 仍未结束，可能需要强制处理 (kill -9 $ACS_CHECK_PID)。"
        fi
    done
fi

echo "==================== 检查异常acs_server进程完成 ===================="